package com.buddies.lottery.utils;

import android.Manifest;
import android.annotation.SuppressLint;
import android.content.Context;
import android.content.pm.PackageManager;
import android.os.Build;
import android.provider.Settings;
import android.telephony.TelephonyManager;
import android.text.TextUtils;

import com.blankj.utilcode.util.MetaDataUtils;
import com.buddies.lottery.App;

public class AppUtils {

    private static String sDeviceId;

    /**
     * Pseudo-Unique ID, 这个在任何Android手机中都有效
     * 有一些特殊的情况，一些如平板电脑的设置没有通话功能，或者你不愿加入READ_PHONE_STATE许可。而你仍然想获得唯
     * 一序列号之类的东西。这时你可以通过取出ROM版本、制造商、CPU型号、以及其他硬件信息来实现这一点。这样计算出
     * 来的ID不是唯一的（因为如果两个手机应用了同样的硬件以及Rom 镜像）。但应当明白的是，出现类似情况的可能性基
     * 本可以忽略。大多数的Build成员都是字符串形式的，我们只取他们的长度信息。我们取到13个数字，并在前面加上“35
     * ”。这样这个ID看起来就和15位IMEI一样了。
     *
     * @return PesudoUniqueID
     */
    public static String getPesudoUniqueID() {
        return "35" +
                Build.BOARD.length() % 10 +
                Build.BRAND.length() % 10 +
                Build.HARDWARE.length() % 10 +
                Build.DEVICE.length() % 10 +
                Build.DISPLAY.length() % 10 +
                Build.HOST.length() % 10 +
                Build.ID.length() % 10 +
                Build.MANUFACTURER.length() % 10 +
                Build.MODEL.length() % 10 +
                Build.PRODUCT.length() % 10 +
                Build.TAGS.length() % 10 +
                Build.TYPE.length() % 10 +
                Build.USER.length() % 10;
    }

    @SuppressLint("HardwareIds")
    public static String getDeviceID() {
        if (!TextUtils.isEmpty(sDeviceId)) {
            return sDeviceId;
        }

        Context context = App.getInstance().getContext();
        TelephonyManager telephoneyManager = (TelephonyManager) context.getSystemService(Context.TELEPHONY_SERVICE);
        if (telephoneyManager != null) {
            if (context.checkCallingOrSelfPermission(Manifest.permission.READ_PHONE_STATE) == PackageManager.PERMISSION_GRANTED) {
                if (Build.VERSION.SDK_INT > Build.VERSION_CODES.O) {
                    sDeviceId = telephoneyManager.getImei();

                    if (TextUtils.isEmpty(sDeviceId)) {
                        sDeviceId = telephoneyManager.getMeid();
                    }
                } else {
                    sDeviceId = telephoneyManager.getDeviceId();
                }
            }
        }

        if (TextUtils.isEmpty(sDeviceId)) {
            sDeviceId = Settings.Secure.getString(context.getContentResolver(), Settings.Secure.ANDROID_ID);
        }

        if (TextUtils.isEmpty(sDeviceId)) {
            sDeviceId = getPesudoUniqueID();
        }

        return sDeviceId;
    }

    public static String getChannel() {
        return MetaDataUtils.getMetaDataInApp("UMENG_CHANNEL");
    }

    public static String getBuildTime() {
        return MetaDataUtils.getMetaDataInApp("BUILD_TIME");
    }

    public static String getAppVersionInfo() {
        return "V" + com.blankj.utilcode.util.AppUtils.getAppVersionName() + "_" + com.blankj.utilcode.util.AppUtils.getAppVersionCode() + getBuildTime();
    }

}
